package com.mlz.domain.dto;


import cn.hutool.core.lang.func.Func;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;

import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 分页结果
 * @param <T>
 */
@Data
public class PageDTO<T> {

    public PageDTO() {
    }

    public PageDTO(Long total, Long pages, List<T> list) {
        this.total = total;
        this.pages = pages;
        this.list = list;
    }

    //总条数
    private Long total;

    //总页数
    private Long pages;

    //集合
    private List<T> list;


    /**
     * 返回空分页结果
     * @param page
     * @return
     * @param <T>
     * @param <S>
     */
    public static<T,S> PageDTO<S> of(Page<T> page)  {
        return new PageDTO<>(page.getTotal(),page.getPages(), Collections.emptyList());
    }

    /**
     *
     * @param page 分页结果
     * @param converter po封装成vo的转换函数
     * @return
     * @param <V> 目标vo类型
     * @param <P> vo的分页对象
     */
    public static<V,P> PageDTO<V> of(Page<P> page, Function<P, V> converter)  {
        // 1.非空校验
        List<P> records = page.getRecords();
        if (records == null || records.isEmpty()) {
            // 没有数据
            return of(page);
        }
        // 2.数据转换
        List<V> vos = records.stream().map(converter).collect(Collectors.toList());

        // 3.数据封装
        return new PageDTO<>(page.getTotal(), page.getPages(),vos);
    }



}
